草庐IT

javascript oop、instanceof 和基类

全部标签

c++ - 为什么声明私有(private)基类会使类型名称不可访问?

令我感到惊讶的是,在以下示例中声明Middle的基类私有(private)使得该名称在后续派生中无法作为类型使用。classBase{public:Base(Baseconst&b):i(b.i){}inti;};classMiddle:privateBase{//因此使用g++(Debian6.3.0-18+deb9u1)6.3.020170516...编译g++-std=c++11privateBase.cpp我得到以下诊断信息:privateBase.cpp:15:9:error:‘classBaseBase::Base’isinaccessiblewithinthisconte

c++ - 指向抽象模板基类的指针?

我想不通。我需要一个抽象模板基类,它是以下内容:templateclassDendrite{public:Dendrite(){}virtual~Dendrite(){}virtualvoidGet(std::vector&o)=0;protected:std::vector_data;};现在,我从中得出Dendrite的具体用法。现在是问题。如何创建指向没有特定类型的基类的指针vector,这我想通过稍后将元素推送到它来指定?像这样的东西:classFoo{public:...private:std::vector_inputs;//!())and//!_inputs.push_b

c++ - 什么时候以及为什么不应该将基类中的析构函数定义为虚拟的?

下面的这个例子说明了如何防止派生类被复制。它基于一个基类,其中复制构造函数和复制赋值运算符都被声明为private。classUncopyable{protected://allowconstructionanddestructionofderivedobjects...Uncopyable(){}~Uncopyable(){}private://butpreventcopying...Uncopyable(constUncopyable&);Uncopyable&operator=(constUncopyable&);};我们可以使用这个类,结合私有(private)继承,使类不可复

c++ - 指向基类的指针总是 <= 指向派生类的指针吗?

我想知道C++标准是否保证单一继承使对象向上“增长”,即classBase和一个classDerived:publicBase,和一个指针Derived*ptr,dynamic_cast(ptr)的结果将始终在数值上小于或等于ptr. 最佳答案 没有。内存布局是实现细节。也就是说,假设没有虚函数,我不知道有任何实际不这样做的实现。如果您在Derived中引入一个虚函数(但在Base中没有),虚表指针可以(取决于实现)放在Base字段之前(使Base*大于Derived*)。澄清:上面的示例是特定于VisualC++的。您可以使用以下

c++ - 从基类引用调用派生类方法

classMaterial{public:voidfoo(){cout我希望这会导致控制台显示“ClassUnusual_Material”。有什么办法可以做到这一点?在我的程序中,我有一个Material类,从中派生出其他更具体的Material。Material::foo()方法表示Material中的一种方法,它适用于大多数Material,但有时,需要为具有异常属性的Material定义另一个foo()。我程序中的所有对象都包含一个Material字段。如果为它们分配了不寻常的Material,我希望调用派生的、不寻常的foo。这可能非常简单,也可能是不可能的,但无论哪种方式我

c++ - C++ 中的根基类

.NET中的每个对象都(直接或间接)继承自公共(public)根基“对象”。C++中有这么一个公共(public)对象根吗?如何将任何对象传递给函数?publicvoidDoSomeStuff(objecto){...}编辑:澄清一下,目的:在那个函数中我想调用一个指向成员函数的指针。为此,我需要对象实例和指向所需函数的指针。为了简化可读性,我想制作一个包含这两个必需信息的包装器。我不确定这是否是最好的方法,但这是背景想法。 最佳答案 没有共同的基类;但是使用类似boost::any或更普遍的基于模板的方法优于void*。

c++ - 纯抽象基类上的虚拟析构函数

我有structIMyInterface{virtualmethod1()=0;virtualmethod2()=0;};GCC坚持认为我有structIMyInterface{virtualmethod1()=0;virtualmethod2()=0;virtual~IMyInterface(){};};我不明白为什么。纯界面就是关于界面的(duh)。析构函数是接口(interface)具体实现者的内部实现细节的一部分;它不构成界面的一部分。我理解整个切片问题(或者至少我认为我理解)所以我的问题是-GCC坚持这样做是否正确?如果是,为什么? 最佳答案

c++ - 基类的虚拟 friend 函数?

我正在学习这门语言,这是一个菜鸟的疑问。是否可以使用虚拟friend功能?我不知道这是否可能,我什至没有测试它,但它在某些情况下可能很有用。例如,对于重载的运算符DerivedClassdc;BaseClass&rbc=dc;cout我猜这是可能的,但我不确定,因为友元函数没有在类设计中实现,理论上也不是它的一部分(尽管在这个例子中,从概念上讲,operator编辑:我的担忧与这个例子有关:BaseClassbc;DerivedClassdc;BaseClass*pArr[2];pArr[1]=bc;pArr[2]=dc;for(inti=0;i在这个混合对象数组中,我希望为每个对象调

c++ - 为什么即使模板类没有基类, `this` 也是类型依赖表达式?

下面的代码可以编译无误:templatestructA{voidf(){this->whatever;}//whateverisnotdeclaredbefore};intmain(){Aa;}我知道这是因为this是一个类型相关的表达式,它为whatever进行名称查找被推迟,直到知道实际的模板参数。由于成员函数f()在这种情况下从未使用过,因此没有实例化A::f存在,并为whatever查找名称永远不会执行。我可以理解this如果类模板有一个依赖于类型的基础,那么它是依赖于类型的:templatestructB{Twhatever;};templatestructA:B{voidf

c++ - 将 reinterpret_cast 的派生类指针转换为基类指针未定义行为吗?

看一个简单的例子:structBase{/*somevirtualfunctionshere*/};structA:Base{/*members,overriddenvirtualfunctions*/};structB:Base{/*members,overriddenvirtualfunctions*/};voidfn(){Aa;Base*base=&a;B*b=reinterpret_cast(base);Base*x=b;//usexhere,callvirtualfunctionsonit}这个小片段是否有未定义的行为?reinterpret_cast定义良好,它返回base